由於從FinMind平台下載的原始數據格式並非直接可用於模型訓練,我們需要進行一系列處理。這是我的流程圖:
本篇我們來講講針對三大法人資料,如何篩選出投信的數據並新增買賣超欄位,接著去除掉無投信介入的股票。
首先,我們需要篩選出投信相關的資料,並計算每個交易日的買賣超金額。這部分的數據處理將為模型的準確性提供至關重要的基礎,因為投信買賣超數據是股價變動的重要指標之一。
以下是處理投信數據並新增買賣超欄位的Python程式碼:
import os
import pandas as pd
# 設定來源資料夾和目標資料夾
source_folder = r'C:\iThome\day13\fm_i_db' #存有FinMind下載的所有個股csv資料夾
destination_folder = r'C:\iThome\day13\fm_io_db'
# 若目標資料夾不存在,則自動建立以儲存篩選後的結果
if not os.path.exists(destination_folder):
os.makedirs(destination_folder)
# 讀取來源資料夾內的所有CSV檔案
for filename in os.listdir(source_folder):
if filename.endswith('.csv'):
file_path = os.path.join(source_folder, filename)
# 讀取CSV文件,並將其轉換為DataFrame
df = pd.read_csv(file_path)
# 篩選出name欄位為"Investment_Trust"的行,表示投信的買賣紀錄
filtered_df = df[df['name'] == 'Investment_Trust']
# 計算投信的買賣超金額,並新增"Buy_Sell_Net"欄位
filtered_df['Buy_Sell_Net'] = filtered_df['buy'] - filtered_df['sell']
# 儲存處理後的數據至目標資料夾,保持原檔名
filtered_file_path = os.path.join(destination_folder, filename)
filtered_df.to_csv(filtered_file_path, index=False)
print("資料處理完成,投信數據已成功篩選並加入買賣超欄位。")
說明:
os.makedirs()
確保目標資料夾存在,這是防止資料夾未建立而導致文件儲存失敗的預防性措施。name
欄位篩選出 "Investment_Trust" 這個投信的買賣紀錄,確保只處理與投信行為相關的數據。Buy_Sell_Net
欄位反映了每個交易日的淨買賣超。某些股票可能沒有任何投信的買賣紀錄,這類數據對於我們的分析沒有實際意義,因此需要將它們從資料集中移除。這可以確保資料集的純度,並提高模型的計算效率。
首先,我們需要生成一個包含有投信數據的股票列表。此列表將作為後續資料篩選的依據。
以下程式碼將遍歷篩選後的資料夾,找出所有含有投信數據的股票檔案,並將這些檔名匯出到一個CSV檔案中,以供後續處理使用。
import os
import pandas as pd
# 設定來源資料夾和目標檔案路徑
source_folder = r'C:\iThome\day13\fm_io_db'
output_csv = r'bsnot0list.csv'
# 用來儲存包含投信買賣超數據的股票檔名前四位
non_zero_files = []
# 遍歷來源資料夾內的所有CSV檔案
for filename in os.listdir(source_folder):
if filename.endswith('.csv'):
file_path = os.path.join(source_folder, filename)
# 讀取CSV文件,並將其轉換為DataFrame
df = pd.read_csv(file_path)
# 檢查"buy"和"sell"欄位是否有非零值,表示有投信買賣紀錄
if (df['buy'].sum() != 0) or (df['sell'].sum() != 0):
# 將檔名前四位(股票代號)加入列表
non_zero_files.append(filename[:4])
# 將檔名前四位儲存至CSV檔案,方便後續篩選
non_zero_df = pd.DataFrame(non_zero_files, columns=['Filename'])
non_zero_df.to_csv(output_csv, index=False)
print(f"包含投信數據的股票編號已儲存至 {output_csv}")
說明:
接下來,我們使用上一步生成的股票編號列表,將無投信數據的股票從資料集中移除,並將結果儲存到一個新的資料夾中。
import os
import shutil
import pandas as pd
# 讀取包含有效投信數據的股票編號列表
list_file = r'C:\iThome\day13\bsnot0list.csv'
df_list = pd.read_csv(list_file)
# 取得有效的股票檔名前四位數
file_prefix_list = df_list['Filename'].astype(str).tolist()
# 設定資料夾路徑
source_folder = r'C:\iThome\day13\fm_db'
destination_folder = r'C:\iThome\day13\fm_pv_filter'
# 若目標資料夾不存在,則自動建立以儲存篩選後的結果
if not os.path.exists(destination_folder):
os.makedirs(destination_folder)
# 遍歷來源資料夾內的所有CSV檔案,篩選有效數據
for filename in os.listdir(source_folder):
if filename[:4] in file_prefix_list and filename.endswith('.csv'):
source_path = os.path.join(source_folder, filename)
destination_path = os.path.join(destination_folder, filename)
# 將有效檔案複製到目標資料夾
shutil.copy(source_path, destination_path)
print("無投信數據的股票已被移除,篩選後的檔案已儲存至目標資料夾。")
說明:
shutil.copy()
方法,我們確保篩選出的檔案能夠準確地被複製到指定的資料夾,實現資料清理流程的全自動化。